/*
 * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.corba.se.impl.ior;

import org.omg.CORBA_2_3.portable.InputStream;

import java.util.Map;
import java.util.HashMap;

import com.sun.corba.se.spi.orb.ORB;

import com.sun.corba.se.spi.ior.Identifiable;
import com.sun.corba.se.spi.ior.IdentifiableFactory;
import com.sun.corba.se.spi.ior.IdentifiableFactoryFinder;

import com.sun.corba.se.spi.logging.CORBALogDomains;

import com.sun.corba.se.impl.logging.IORSystemException;

public abstract class IdentifiableFactoryFinderBase implements
    IdentifiableFactoryFinder {

  private ORB orb;
  private Map map;
  protected IORSystemException wrapper;

  protected IdentifiableFactoryFinderBase(ORB orb) {
    map = new HashMap();
    this.orb = orb;
    wrapper = IORSystemException.get(orb,
        CORBALogDomains.OA_IOR);
  }

  protected IdentifiableFactory getFactory(int id) {
    Integer ident = new Integer(id);
    IdentifiableFactory factory = (IdentifiableFactory) (map.get(
        ident));
    return factory;
  }

  public abstract Identifiable handleMissingFactory(int id, InputStream is);

  public Identifiable create(int id, InputStream is) {
    IdentifiableFactory factory = getFactory(id);

    if (factory != null) {
      return factory.create(is);
    } else {
      return handleMissingFactory(id, is);
    }
  }

  public void registerFactory(IdentifiableFactory factory) {
    Integer ident = new Integer(factory.getId());
    map.put(ident, factory);
  }
}
